#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    EnvFile="../common/0_env.sh"
    # shellcheck source=../common/0_env.sh
    source ${EnvFile}
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试在同一个配额目录内部 rename/mv file"
echo -e "***********************************************************************"

tmp_dir="/test_rename_dir"
src_dir="/test_rename_dir/src_dir"
dest_dir="/test_rename_dir/dest_dir"
abs_tmp_dir="${MountPoint}${tmp_dir}"
abs_src_dir="${MountPoint}${src_dir}"
abs_dest_dir="${MountPoint}${dest_dir}"

function init_dir()
{
    mkdir -p ${abs_tmp_dir}
    clean_dir ${abs_tmp_dir}
    orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
    chown -R root:root ${abs_tmp_dir}
    remove_all_quota_for_dir ${tmp_dir}

    # mkdir -p ${abs_sub_dir}
}

function test_no_quota()
{
    echo -e "\n------测试没有配额时 mv------"
    srcFile="${abs_tmp_dir}/file"
    destFileExist="${abs_tmp_dir}/file_exist"
    destFileUnexist="${abs_tmp_dir}/file_unexist"
    echo "aaa" > ${srcFile}
    echo "bbb" > ${destFileExist}
    test_cmd "mv ${srcFile} ${destFileExist}"     # 同一个父目录，目标存在
    test_cmd "cat ${destFileExist}"
    echo "aaa" > ${srcFile}
    test_cmd "mv ${srcFile} ${destFileUnexist}"   # 同一个父目录，目标不存在
    test_cmd "cat ${destFileUnexist}"

    subDirFileExist="${abs_sub_dir}/subdir_file_exist"
    subDirFileUnexist="${abs_sub_dir}/subdir_file_unexist"
    echo "aaa" > ${srcFile}
    echo "bbb" > ${subDirFileExist}
    test_cmd "mv ${srcFile} ${subDirFileExist}"     # 同一个父目录，目标存在
    test_cmd "cat ${subDirFileExist}"
    echo "aaa" > ${srcFile}
    test_cmd "mv ${srcFile} ${subDirFileUnexist}"   # 同一个父目录，目标不存在
    test_cmd "cat ${subDirFileUnexist}"

    clean_dir ${abs_tmp_dir}
}

function test_sameParentdir_unexistDest()
{
    echo -e "\n------同一个父目录，目标文件 <不存在>------"
    create_quota ${tmp_dir} "--hardnum=1000"
    
    srcFile="${abs_tmp_dir}/file"
    destFile="${abs_tmp_dir}/file_unexist"
    test_cmd "echo aaa > ${srcFile}"
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"

    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_sameParentdir_existDest()
{
    echo -e "\n------测试<普通目录>配额：同一个父目录，目标文件 <存在>------"
    create_quota ${tmp_dir} "--hardnum=1000"
    
    srcFile="${abs_tmp_dir}/file"
    destFile="${abs_tmp_dir}/file_exist"
    test_cmd "echo 123456 > ${srcFile}"
    test_cmd "echo aaa > ${destFile}"
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"

    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_sameParentdir_existDest_id()
{
    echo -e "\n------测试<uid/gid>配额：同一个父目录，目标文件 <存在>------uid/gid"
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000 --uid=${SysUid}"
    create_quota ${tmp_dir} "--hardnum=1000 --gid=${SysGid}"
    
    srcFile="${abs_tmp_dir}/file"
    destFile="${abs_tmp_dir}/file_exist"

su ${SysUser} <<EOF
    source ${commonFunc}
    test_cmd "echo 123456 > ${srcFile}"
    test_cmd "echo aaa > ${destFile}"
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"
EOF

    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
}

function test_diffParentdir_existDest()
{
    echo -e "\n------测试<普通目录>配额：不同父目录，目标文件 <存在>------"
    mkdir -p ${abs_src_dir}
    mkdir -p ${abs_dest_dir}
    create_quota ${tmp_dir} "--hardnum=1000"
    
    srcFile="${abs_src_dir}/file"
    destFile="${abs_dest_dir}/file_exist"
    test_cmd "echo 123456 > ${srcFile}"
    test_cmd "echo aaa > ${destFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_diffParentdir_existDest_id()
{
    echo -e "\n------测试<普通目录>配额：不同父目录，目标文件 <存在>------uid/gid"
    chmod 0777 ${abs_tmp_dir}
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000 --uid=${SysUid}"
    create_quota ${tmp_dir} "--hardnum=1000 --gid=${SysGid}"
    
    srcFile="${abs_src_dir}/file"
    destFile="${abs_dest_dir}/file_exist"

su ${SysUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_src_dir}
    test_cmd "echo 123456 > ${srcFile}"
EOF

su ${HzzUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_dest_dir}
    test_cmd "echo aaa > ${destFile}"
EOF
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    test_cmd "mv ${destFile} ${srcFile}"   
    test_cmd "cat ${srcFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
}

function test_diffParentdir_unexistDest()
{
    echo -e "\n------测试<普通目录>配额：不同父目录，目标文件 <不存在>------配额不变"
    mkdir -p ${abs_src_dir}
    mkdir -p ${abs_dest_dir}
    create_quota ${tmp_dir} "--hardnum=1000"
    
    srcFile="${abs_src_dir}/file"
    destFile="${abs_dest_dir}/file_exist"
    test_cmd "echo 123456 > ${srcFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_diffParentdir_unexistDest_uid()
{
    echo -e "\n------测试<普通目录>配额：不同父目录，目标文件 <不存在>------"
    mkdir -p ${abs_src_dir}
    mkdir -p ${abs_dest_dir}
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000" "--uid=${SysUid}"
    
    srcFile="${abs_src_dir}/file"
    destFile="${abs_dest_dir}/file_exist"

su ${SysUser} <<EOF
    source ${commonFunc}
    test_cmd "echo 123456 > ${srcFile}"
EOF
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

su ${SysUser} <<EOF
    source ${commonFunc}
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"
EOF

    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_diffParentdir_unexistDest_diff_uid()
{
    echo -e "\n------测试<普通目录>配额：不同父目录，目标文件 <不存在>------父目录 uid 不同"
    mkdir -p ${abs_src_dir}
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    chmod 0777 -R ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000" "--uid=${SysUid}"
    
    srcFile="${abs_src_dir}/file"
    destFile="${abs_dest_dir}/file_exist"

su ${SysUser} <<EOF
    source ${commonFunc}
    test_cmd "echo 123456 > ${srcFile}"
EOF
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

su ${HzzUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_dest_dir}
EOF
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    test_cmd "mv ${destFile} ${srcFile}"   
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_diffParentdir_unexistDest_diff_gid()
{
    echo -e "\n------测试<普通目录>配额：不同父目录，目标文件 <不存在>------父目录 gid 不同"
    mkdir -p ${abs_src_dir}
    chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}
    chmod 0777 -R ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=1000" "--gid=${SysGid}"
    
    srcFile="${abs_src_dir}/file"
    destFile="${abs_dest_dir}/file_exist"

su ${SysUser} <<EOF
    source ${commonFunc}
    test_cmd "echo 123456 > ${srcFile}"
EOF
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

su ${HzzUser} <<EOF
    source ${commonFunc}
    mkdir -p ${abs_dest_dir}
EOF
    test_cmd "mv ${srcFile} ${destFile}"   
    test_cmd "cat ${destFile}"
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    test_cmd "mv ${destFile} ${srcFile}"   
    sleep_check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
}

init_dir

# 测试没有配额时 rename file
 test_no_quota 

# 测试同一配额目录<相同父目录>，且目标文件不存在，不改变配额
 test_sameParentdir_unexistDest 

# 测试同一配额目录<相同父目录>，且目标文件不存在，目标文件被删除
 test_sameParentdir_existDest
 test_sameParentdir_existDest_id

# 测试同一配额目录<不同父目录>，且目标文件存在
 test_diffParentdir_existDest
 test_diffParentdir_existDest_id

# 测试同一配额目录<不同父目录>，且目标文件不存在
 test_diffParentdir_unexistDest
 test_diffParentdir_unexistDest_uid
 test_diffParentdir_unexistDest_diff_uid
 test_diffParentdir_unexistDest_diff_gid








